Consumption-based asset pricing

(limits and extensions)

NOTE: The present notebook is coded with quarto, in the R programming language. The white margin to the right will be used to display code output.

This document relies heavily on the tidyverse ecosystem of packages. We load the tidyverse below as a prerequisite for the rest of the notebook - along with a few other important libraries.

library(tidyverse)  # Package for data wrangling
library(readxl)     # Package to import MS Excel files
library(latex2exp)  # Package for LaTeX expressions
library(quantmod)   # Package for stock data extraction

\(\rightarrow\) Don’t forget that code flows sequentially. A random chunk may not work if the previous ones have have not been executed.

1 Outline of the course

Macroeconomics is a vast discipline. There are many valuable textbooks on the matter, but we take for instance the recent and excellent Advanced Macroeconomics - An Easy Guide (henceforth referred to as CSV2021). Its content is divided into the following sections:

  • Growth Theory
    • Growth theory preliminaries
    • The neoclassical growth model
    • An application: The small open economy
    • Endogenous growth models I: Escaping diminishing returns
    • Endogenous growth models II: Technological change
    • Proximate and fundamental causes of growth
  • Overlapping Generations Models
    • Overlapping generations models
    • An application: Pension systems and transitions
    • Unified growth theory
  • Consumption and Investment
    • Consumption
    • Consumption under uncertainty and macro finance
    • Investment
  • Short Term Fluctuations
    • Real business cycles
    • (New) Keynesian theories of fluctuations: A primer
    • Unemployment
  • Monetary and Fiscal Policy
    • Fiscal policy I: Public debt and the effectiveness of fiscal policy
    • Fiscal policy II: The long-run determinants of fiscal policy
    • Monetary policy: An introduction
    • Rules vs Discretion
    • Recent debates in monetary policy
    • New developments in monetary and fiscal policy

Most of these themes may have been covered in introductory courses earlier.
The curriculum of the present offering seeks to dive into subjects that are less mainstream, hence its title: Topics in Financial Macroeconomics! The themes in green in the above list will be evoked in the present session.

  1. Consumption-based models (C-CAPM) and critiques
  2. Rare events and long-term risks
  3. Asset pricing with heterogeneous agents
  4. Green growth and green financial models (S-CAPM)
  5. Equity premium prediction
  6. Introduction to commodities market: Physical and future markets
  7. Global asset allocation
  8. Nowcasting macroeconomic variable: the case of GDP

Below, we propose a list of references for the course.

2 Foundations and notations

Historical note: the consumption capital asset pricing model (C-CAPM) is routinely attributed to Breeden’s 1979 intertemporal asset pricing model with stochastic consumption and investment opportunities, but other contributions are close in spirit, e.g., Lucas’ 1978 Asset prices in an exchange economy.

2.1 The Euler equation

For simplicity, we follow here the notations of Cochrane, but also link to other references along the way.

Time is discrete and denoted with \(t\). There is a unique (representative, aggregate) investor on the market who needs to decide on some consumption level \(c_t\) at time \(t\). His choice is entirely driven by a utility function \(u\) that operates on the consumption. We first consider a two-period model hence the time-\(t\) utility across these two periods is

\[U(c_t,c_{t+1})=u(c_t)+\beta \, \mathbb{E}_t[u(c_{t+1})],\] where \(\beta \in (0,1)\) is a discounting factor which reflects the fact that 1$ or 1€ today is worth more than the same amount in a future date (value depreciation). This comes from the fact that if I borrow or lend money, there will be a non-zero interest rate. Hence if I borrow 1$, I will have to reimburse slightly more in the future. Reversely, the value today of 1$ a year from now is lower than 1$.

In other books, e.g. CSV2021, authors sometimes use \(\beta=(1+\rho)^{-1}\). Moreover, \(\mathbb{E}_t[\cdot]\) is the expectation operator, conditionally on the information available at time \(t\).

Now, the investor is able to act on a financial market and by a risky asset at price \(p_t\). At time \(t+1\), the payoff \(x_{t+1}=p_{t+1}+d_{t+1}\) is equal to the future price plus potential dividends. She invests a quantity \(w\) (\(\xi\) in Cochrane) in this asset. A major question pertains to the optimal level of \(w\). Then,

  • time-\(t\) consumption is equal to the original level (when financial markets are not available), \(e_t\), minus the investment in the market \(wp_t\);
  • time-\(t+1\) consumption is \(e_{t+1}\) (baseline value) plus \(w x_{t+1}\) (proceedings of the financial investment).
  • the baseline levels of consumption \(e_t\) and \(e_{t+1}\) do not matter here, they are silent variables.

We thus seek to maximize \(\, U(c_t,c_{t+1})=u(e_t-wp_t)+\beta \, \mathbb{E}_t[u(e_{t+1}+wx_{t+1})]\) with respect to \(w\). We thus differential the above expression with respect to \(w\) and equate to zero (first order condition): \[\frac{\partial U(c_t,c_{t+1})}{\partial w}= -p_t u'(c_t) +\beta \, x_{t+1}\mathbb{E}_t[u'(c_{t+1})]=0 \quad \Longleftrightarrow \quad p_t=\beta \,\mathbb{E}_t\left[ \frac{u'(c_{t+1})}{u'(c_t)}(p_{t+1}+d_{t+1})) \right]\]

where we have assumed that the conditions of the Leibniz rule are satisfied.

Important

If we write the (gross) total return \(r_{t+1}=(p_{t+1}+d_{t+1})/p_t>0\), we get the Euler equation: \[\beta \,\mathbb{E}_t\left[ \frac{u'(c_{t+1})}{u'(c_t)}r_{t+1}\right]=1, \tag{1}\]

A similar representation can be found in The Valuation of Uncertain Income Streams and the Pricing of Options (Rubinstein - 1976).

Importantly, we can roll the expression by substituting \(p_{t+1}\) with its own value:

\[p_{t}=\beta \mathbb{E}_t \left[\frac{u'(c_{t+1})}{u'(c_t)} \left( \mathbb{E}_{t+1} \left[ \beta \frac{u'(c_{t+2})}{u'(c_{t+1})}(p_{t+2}+d_{t+2}) \right]+d_{t+1} \right) \right]\]

and, ultimately, using the Tower property of the conditional expectation, we obtain

\[p_t= \mathbb{E}_t \left[ \sum_{s=1}^\infty \beta^s \frac{u'(c_{t+s})}{u'(c_t)}d_{t+s} \right]. \tag{2}\]

Important

In the Euler equation, there is an important term, the stochastic discount factor: \[m_{t+1}= \beta \frac{u'(c_{t+1})}{u'(c_t)}. \tag{3}\]

Several remarks:

  • \(m_{t+1}\) is also sometimes called the pricing kernel because it can be used to price all assets!
  • given its shape with the derivatives, in economics it is also referred to as the marginal rate of substitution: it is the rate at which the investor will be willing to trade consumption at time \(t+1\) with consumption at time \(t\).
  • In compact form, we have \(\mathbb{E}_t[m_{t+1}r_{t+1}]=1\), which is the bedrock in consumption-based asset pricing. Though, to be honest, \(m_{t+1}\) remains somewhat a mystery and its characterization/estimation is a recurring challenge - whereas the \(r_{t+1}\) are directly observable.

2.2 The risk premium

Let’s go back to Equation 1, with \(\mathbb{E}_t[m_{t+1}r_{t+1}]=1\). Because it holds that \(\mathbb{E}[XY]=\text{cov}(X,Y)+\mathbb{E}[X]\mathbb{E}[Y]\), we have \[1= \text{cov}_t(m_{t+1},r_{t+1})+\mathbb{E}_t[m_{t+1}]\mathbb{E}_t[r_{t+1}]. \tag{4}\]

Now, recall that this holds for any kind of asset. This expression is found in many contributions. For instance, it is Equation 4 in The Determinants of the Variability of Stock Market Prices in its unconditional form. We now assume the existence of two types of assets:

  • a generic risky asset with superscript \(n\) and for which \(1= \text{cov}_t(m_{t+1},r^n_{t+1})+\mathbb{E}_t[m_{t+1}]\mathbb{E}_t[r^n_{t+1}]\) and
  • a risk-free asset with superscript \(f\) and for which \(1= \mathbb{E}_t[m_{t+1}]\mathbb{E}_t[r^f_{t+1}]\) where the covariance term vanishes because the variance of \(r^f\) is zero - it’s basically non-random, but the mean can very well be non-zero.

Now, because both Euler equations are equal to one, we have \[\mathbb{E}_t[r^n_{t+1}-r^f_{t+1}]= - \frac{\text{cov}_t(m_{t+1},r^n_{t+1})}{\mathbb{E}_t[m_{t+1}]}=-\mathbb{E}_t[r^f_{t+1}]\text{cov}_t(m_{t+1},r^n_{t+1}). \tag{5}\] This quantity defines the excess return of asset \(n\) over asset \(f\). When \(n\) is a broad market index, wuch as the S&P 500 for instance, this spread is called the equity risk premium.
Now, let us illustrate this further with a canonical example.

When \(u(c)=c^{1-\gamma}/(1-\gamma)\), where \(\gamma \in \mathbb{R}_+^* \backslash \{ 1\}\) is the constant relative risk aversion, we have \(u'(c)=c^{-\gamma}\). The case \(\gamma=1\) corresponds to a logarithmic utility. The stochastic discount factor is \(m_{t+1}=\beta (c_{t+1}/c_t)^{-\gamma}\). Next, we follow some derivations of Hansen & Singleton 1983.

We write \(g_{t+1}=c_{t+1}/c_t>0\) for the gross rate of consumption growth so that Equation 1 with \(u_{t+1}=g_{t+1}^{-\gamma} r_{t+1}\) gives \[\mathbb{E}_t[ u_{t+1}]=\mathbb{E}_t\left[ g_{t+1}^{-\gamma} r_{t+1}\right]=\beta^{-1}.\] Moreover, we use uppercase letters for log-quantities: \(R_{t+1}=\log(r_{t+1})\), \(G_{t+1}=\log(g_{t+1})\), \(U_{t+1}=\log(u_{t+1})\).
\(\rightarrow\) Assumption: \(U_{t+1}=-\gamma G_{t+1}+ R_{t+1}\) follows a Gaussian distribution and we write \(\mu_t\) and \(\sigma_t^2\) for the corresponding conditional mean and variance. This implies \(\mathbb{E}_t[g_{t+1}^{-\gamma}r_{t+1}]=e^{\mu_t+\sigma_t^2/2}\) and taking the log, \(\mu_t+\sigma_t^2/2=\log(\beta^{-1})\). By definition \(\mathbb{E}_t[U_{t+1}]-\mu_t=0=\mathbb{E}_t[-\gamma G_{t+1}+R_{t+1}]-\log(\beta^{-1})+\sigma_t^2/2.\) Thus,

\[\mathbb{E}_t\left[R_{t+1}^{(n)}\right]=\gamma \mathbb{E}_t[G_{t+1}]-\log(\beta)-(\sigma_t^{(n)})^2/2 \tag{6}\]

Note that this expression holds for any asset \((n)\) and specifies the link between the asset’s return and consumption growth. Hence, if there are more than one unknowns (e.g., \(\lambda\) and \(\beta\)), several assets will be required for estimation.

2.3 The frontier and linear SDFs

We re-write Equation 5 as

\[\mathbb{E}_t[r^n_{t+1}]=r^f_{t+1}-\text{cor}_t(m_{t+1},r^n_{t+1})\frac{\sqrt{\mathbb{V}_t[m_{t+1}]\mathbb{V}_t[r^n_{t+1}]}}{\mathbb{E}_t[m_{t+1}]} \tag{7}\]

Below we show some implications of this equality. First, because correlations are smaller than one, we have that all assets can be represented in a wedge region (loosely written: \(|r^n-r^f|\le \sigma^n\sigma^m/r^m\)), as shown in the Figure below, taken from Cochrane’s Asset Pricing book.

In addition, the upper line corresponds to the efficient frontier and holds when the correlation with \(m\) is equal to one. Hence, it is customary to assume a linear specification for the SDF: \[m_{t+1}=a+br^{mv}_{t+1}, \tag{8}\] where \(r^{mv}\) is the return of an asset on the mean-variance frontier and the constants \(a\) and \(b\) are determined by plugging \(r^{mv}_{t+1}\) and \(r^f_{t+1}\) in the pricing Equation 4 (see Exercise 3 in the Asset Pricing book).

The representation Equation 8 is very convenient but also somewhat restrictive. The C-CAPM, as well as the CAPM imply linear single factor models. We refer to Asset Pricing with Observable Stochastic Discount Factors for a survey on other forms of SDFs, especially in higher dimensions.

Note that this is somewhat of a magical twist! Indeed, the spirit of the C-CAPM is to price assets based on their exposure to consumption growth risk. But in the above model, the risk comes from the MV-portfolio…

In fact, it is also possible to model \(m_{t+1}\) as a affine function of consumption growth. For instance, if we consider a quadratic utility function (\(u(x)=ax-bx^2\)), then \(u'(c_{t+1})/u'(c_t)=c_{t+1}/c_t\)! To be plugged in Equation 3.

3 Discussion & Extensions

3.1 Critiques

The purpose of economic models is to explain salient empirical facts. The empirical applications in the course are presented below. Before that, we dive into academic references that criticize the C-CAPM. There are several ways to test the model:

  • first, one major issue which we’ll address below is the level of risk aversion. Equation 6 links average returns to other quantities, especially linked to consumption growth. All terms are relatively easy to estimate, except risk aversion, which is used as a degree of freedom.

    • Basically, if there is only one asset, we solve the equation where it is the unknown.
    • If there are many assets, we can compute the mean squared error of the model, depending on levels of \(\gamma\) and seek the value that minimizes the error. This exercise is carried out in Euler equation errors and we provide the outcome below. The minimizing value for risk aversion is 117, which is unrealistically high (see Section 4.2 below for a benchmark). Pricing errors as a function of risk aversion
  • Another angle of attack is the following, for which we follow Risk and Return- Consumption Beta Versus Market Beta. From Equation 4, we can decompose the average return in the following way by artificially inserting the market return \(M\): \(\mathbb{E}_t[r^n_{t+1}]=\frac{1}{\mathbb{E}_t[m_{t+1}]}- \frac{\text{cov}_t[R^M_{t+1},g_{t+1}]}{\mathbb{E}_t[m_{t+1}]} \times \frac{\text{cov}_t[R^n_{t+1},g_{t+1}]}{\text{cov}_t[R^M_{t+1},g_{t+1}]}\), and hence we can seek to estimate a model of the form \(r^n_t=a+bx^C_t+e_t,\) where \(x^C_t\) is a consumption-factor relying on the market return. Now, there is a similar model in finance, the simple CAPM, where \(x^M_t\) is simply the market return. In Risk and Return- Consumption Beta Versus Market Beta, the model is \(r_t=a+b_Cx^C_t+b_Mx_t^M+e_t\) in order to capture which factor matters the most. And it turns out that it’s the market factor, by far!

  • Evidence from the field is also pretty bad. In A New Test of Risk Factor Relevance, the authors find that when asking people about investment decisions, correlation between returns and consumption growth is not considered…

We will not follow this avenue below, hence it is worthwhile to mention that habit-based models have been proposed as solutions to these flaws, see for instance Explaining the Poor Performance of Consumption-Based Asset Pricing Models. The main departure is that utility is not derived from raw consumption, but from consumption above a particular habit level.

3.2 Alternative: production-based asset pricing

The C-CAPM relies on consumption as the driving state variable. But output (production) would be another choice. In fact, some papers sometimes choose to conveniently equate the two! Indeed, you can only consume what you produce (in a closed economy).

Importantly, in this session, we examine the following question: can macroeconomic variables (such as aggregate consumption) help explain market fluctuations. The reverse question (do market returns drive economic growth?) has received little attention, but is briefly tested in the first paper mentioned in the above list.

The links between markets and growth are mostly studied through the lens of the financing liquidity that markets permit (as a booster to the real economy). We for instance refer to the surveys A survey of recent developments in the literature of finance and growth and Finance and growth - Theory and evidence.

Below, we follow Predicting Stock Returns in an Efficient Market, who propose more of a general equilibrium model than a pure production-focused one. It is compact, hence pleasant, a we outline it briefly.

  • Firm and production. A representative firm produces some output at time \(t\), \(y_t\). Instantaneously, it divides this output between investment \(i_t\) (for future production) and dividends \(d_t\), paid to the shareholders. The investment becomes productive as capital \(k_{t+1}\) during the next period. Future production \(y_{t+1}\) depends on this factor (\(k_{t+1}\)), as well as on a random unit-mean productivity shock, \(\theta_{t+1}\): \(y_{t+1}\propto \theta_{t+1}k_{t+1}^\alpha\) for some \(\alpha \in (0,1)\). The supply of shares of the firms is fixed to 1. Dividends are proportional to output \(d_t \propto y_t\). This is assumed here to ease the exposition, but it comes from the solution of the firms’ dividend-maximizing objective. Likewise, time-\((t+1)\) investment/capital is proportional to \(y_t\). In the end, \[y_{t+1}= AB^t\theta_{t+1}k^\alpha_{t+1}=\gamma B^t\theta_{t+1}y_t \tag{9}\]
  • Agent and consumption. The representative consumer maximizes \(u(c_t)+\beta \mathbb{E}_t[u(c_{t+1})]\) and for simplicity, \(u\) will later on be set to the log function. The maximization is subject to the budget constraint \(c_t+p_ts_{t+1}=(d_t+p_t)s_t\), where \(s_t\) is the amount invested (number of shares). Differentiating with respect to \(s_{t+1}\) gives the Euler equation: \[p_t u'(c_t)=\beta \mathbb{E}_t[(p_{t+1}+d_{t+1})u'(c_{t+1})].\] Iterating forward gives \[p_t=\mathbb{E}_t\left[\sum_{s=1}^\infty \beta^s(u'(c_{t+s})/u'(c_t))d_{t+s}\right]\]
  • Simplifying assumptions. If we set a unit supply of shares \(s_t=1\) (implying \(d_t=c_t\)) and log utility, this all simplifies to \(p_t=\frac{\beta d_t}{1-\beta}\). To see this: all terms in time \(t+s\) vanish in the above sum. The total gross return is then \[R_{t+1}=\frac{p_{t+1}+d_{t+1}}{p_t}=\frac{d_{t+1}}{\beta d_t}=\frac{y_{t+1}}{\beta y_t},\] Where the second equality comes from the fact that dividends are proportional to output.

This gives a testable equation: \(\log(R_{t+1})=-\log(\beta)+\log(y_{t+1})-\log(y_t)\), and, substituting Equation 9 (roughly assuming \(y_t \approx y_{t+1}\)), we get a model of the form: \[r_{t+1}=\log(R_{t+1})=c +Bt+ b \log(y_t)+e_{t+1}, \quad \text{with} \quad b<0.\]

3.3 Alternative: higher order cumulants

In this section, we follow Consumption-Based Asset Pricing with Higher Cumulants. We go back to Equation 2. In the original paper, Epstein-Zin preferences are considered for the general model, but we follow the simpler exposition with CRRA preferences. In this case, starting at \(t=0\) for simplicity, \[p_0=\mathbb{E}\left[\sum_{t=1}^\infty e^{-\rho t}\left(\frac{c_t}{c_0}\right)^{-\gamma} d_t\right]\]

Now, as we have seen before, consumption often relates to the dividends that the agent receives, hence, we postulate that \(d_t=c_t^\lambda\) for some \(\lambda \ge 0\). A simplification occurs and if we assume that log consumption growth is i.i.d.:

\[p_0=c_0^\lambda \mathbb{E}\left[\sum_{t=1}^\infty e^{-\rho t}\left(\frac{c_t}{c_0}\right)^{\lambda-\gamma}\right]=d_0 \sum_{t=1}^\infty e^{-\rho t}\mathbb{E}\left[\left(\frac{c_t}{c_0}\right)^{\lambda-\gamma}\right]\]

and continuing…

\[p_0=d_0 \sum_{t=1}^\infty e^{-\rho t}\mathbb{E}\left[e^{(\lambda-\gamma )\log(c_t/c_0)}\right]=d_0 \sum_{t=1}^\infty e^{-\rho t}\mathbb{E}\left[e^{(\lambda-\gamma )\log(c_1/c_0)}\right]^t\]

Here \(g=c_1/c_0\) is consumption growth and has the same distribution across time (\(c_{t+1}/c_t\)). The trick is then to define the cumulant-generating function: \(c(\theta)=\log(\mathbb{E}[e^{\theta g}])\). We then have \[p_0=d_0\sum_{t=0}^\infty e^{-(\rho-c(\lambda-\gamma))t}=d_0\frac{e^{-(\rho-c(\lambda-\gamma))}}{1-e^{-(\rho-c(\lambda-\gamma))}}.\]

In particular, the log dividend yield is \(dy=\log(1+d_0/p_0)=\rho-c(\lambda-\gamma)\).
Note that if we take \(\lambda=0\) (constant dividend), this brings us to the case of a risk-free asset. Hence, the risk-free rate in the model is \(r_f=\rho-c(-\gamma)\).

For risky asset, because the price/dividend ratio is constant, the gross return is \[R_{t+1}=\frac{p_{t+1}+d_{t+1}}{p_t}=\frac{p_{t+1}}{p_t}\left(1+\frac{d_{t+1}}{p_{t+1}}\right)=\frac{d_{t+1}}{d_t}e^{\rho-c(\lambda-\gamma)} \]

and its average, by the link between consumption and dividends, is \[\mathbb{E}[R_{t+1}]=\mathbb{E}\left[\left( \frac{c_{t+1}}{c_t}\right)^\lambda\right]e^{\rho-c(\lambda-\gamma)}=e^{c(\lambda)+\rho-c(\lambda-\gamma)}\] and the risk premium is (subtracting \(r_f=\rho-c(-\gamma)\)): \(e^{c(\lambda)+c(-\gamma)-c(\lambda-\gamma)}\).

This approach is more flexible than the standard C-CAPM for an obvious reason: we have some latitude to choose the cumulant function. For instance when log-growth is driven by a jump diffusion (Brownian motion plus compound Poisson process). There is of course an example in the original paper:

3.4 Alternative: Epstein-Zin preferences

Here we follow Epstein-Zin 1991, with a bifurcation towards Asset Pricing with Observable Stochastic Discount Factors - Section 2.2.1 at the end. The core of the contribution is the utility function

\[U_t=\left( (1-\beta) c_t^{\rho}+\beta \mathbb{E}_t[U_{t+1}^\alpha]^{\rho / \alpha} \right)^{1/\rho},\]

where \(\beta\) is linked to time preferences (consume now versus enjoy higher expected utility tomorrow), \(\alpha\), to relative risk aversion over future utility and \(\rho\) to the elasticity of intertemporal substitution.1

The agent has access to financial markets with \(N\) assets, with gross returns (\(p_t/p_{t-1}\)) stacked in vector notation \(R_t\). She has a portfolio choice decision to make, ie, the allocation vector in these assets, again in vector notation \(w_t\) with \(1'w_t=1\) as budget constraint.

The wealth of the agent evolves as \(A_{t+1}=(A_t-c_t) \times w'_tR_{t+1}\): she invests what she does not consume. The Bellman equation is then

\[J(A_t)=\underset{c_t,w_t}{\max} \left\{ \left((1-\beta) c_t^\rho +\beta\mathbb{E}_t[J(A_{t+1})^\alpha]^{\rho/\alpha} \right)^{1/\rho} \right\} \tag{10}\]

Now, let’s assume the solution is linear in wealth: \(J(A_t)=\phi_t A_t\). Plugging \(A_{t+1}\), we must maximize consumption so that \[(1-\beta)c_t^\rho+\beta (A_t-c_t)^\rho \mathbb{E}[(\phi_{t+1}R^*_{t+1})^\alpha]^{\rho/\alpha},\] with \(R^*_{t+1}=w^*_tR_{t+1}\) the return of the optimal portfolio (to be determined later on).
The first order condition (FOC) with respect to \(c_t\):

\[\rho(1-\beta)c_t^{\rho-1}-\rho\beta(A_t-c_t)^{\rho-1} \mathbb{E}_t[( \phi_{t+1} R^*_{t+1})^\alpha]^{\rho/\alpha}=0.\] In addition, as is customary, let’s also assume that consumption is proportional to wealth \(c_t=\psi_tA_t\), and we get for \(\mu=\mathbb{E}_t[ (\phi_{t+1} R^*_{t+1})^\alpha]^{1/\alpha}\),

\[(1-\beta)\psi_t^{\rho-1}=\beta(1-\psi_t)^{\rho-1}\mu^\rho. \tag{11}\]

Going back to the original Bellman Equation 10, at the optimum,

\[(\phi_tA_t)^\rho=(1-\beta)(\psi_tA_t)^\rho+\beta (A_t(1-\psi_t))^\rho \mu^\rho.\]

Notice the common right terms between the above equation and Equation 11. So, plugging \((1-\psi_t)\) times Equation 11, we get

\[\phi_t=(1-\beta)^{1/\rho}\psi_t^{1-1/\rho}=(1-\beta)^{1/\rho}(c_t/A_t)^{1-1/\rho},\] a result slightly different from the original paper.

Now, Equation 11 implies (replacing \(\phi_{t+1}\) in \(\mu\) by its above value)

\[\frac{\beta}{1-\beta} \left(\frac{1-\psi_t}{\psi_t} \right)^{\rho-1}\mathbb{E}_t\left[(\phi_{t+1}R^*_{t+1})^\alpha \right]^{\rho/\alpha}=1=\left(\frac{A_t-c_t}{c_t} \right)^{\rho-1}\beta\mathbb{E}_t\left[ (\psi_{t+1}^{1-1/\rho}R^*_{t+1})^\alpha\right]^{\rho/\alpha}.\]

Note that by the law of motion of the wealth, \[\psi_{t+1}^{1-1/\rho}=(c_{t+1}/A_{t+1})^{1-1/\rho}=(c_{t+1}/((A_t-c_t)R^*_{t+1}))^{1-1/\rho},\]

hence thanks to the exponents, a major simplification occurs:

\[\mathbb{E}_t\left[ \beta \left(\frac{c_{t+1}}{c_t} \right)^{1-1/\rho} (R_{t+1}^*)^{\alpha/\rho} \right]=1,\]

which is a familiar form! The work is not over though, as we also need to derive the FOC with respect to \(w\) in Equation 10. We skip the details here and refer to the original derivations for more details on the matter (Equations (14)-(16) in Epstein-Zin 1991). In the end, we obtain \(N\) equations which have the following expression:

\[\mathbb{E}_t\left[\gamma_0\left(\frac{c_{t+1}}{c_t}\right)^{\gamma_1}(R^*_{t+1})^{\gamma_2}R_{j,t+1} \right]=1, \quad j=1,\dots,N,\] for some constants \(\gamma_0\), \(\gamma_1\) and \(\gamma_2\).

If all random (log) terms follow a multivariate Gaussian distribution function, then via the moment generating function \(\mathbb{E}[e^{\theta X}]=e^{\theta' \mu+(\theta'\Sigma\theta )/2}\), we obtain the level of the average risk free rate and subsequently that of the equity premium:

\[r_f=-\log(\gamma_0)-\frac{\gamma_1^2}{2}\sigma_{\Delta c}^2-\frac{\gamma_2^2}{2}\sigma^2_*-\gamma_1\mathbb{E}[\Delta c]-\gamma_2\mathbb{E}[r^*]-\gamma_1\gamma_2\sigma_{\Delta c,*,t}\]

\[\mathbb{E}_t[r_{j,t+1}]-r_f=-\frac{\sigma_{j,t}^2}{2}-\gamma_1 \sigma_{j,\Delta c,t}-\gamma_2\sigma_{j,r^*,t}, \tag{12}\] where \(\sigma_{j,x,t}\) is the conditional covariance between the return of asset \(j\) and variable \(x\) (note that \(\gamma_1\) and/or \(\gamma_2\) may be negative). Indeed, we have

\[\gamma_0\left(\frac{c_{t+1}}{c_t}\right)^{\gamma_1}(R^*_{t+1})^{\gamma_2}R_{j,t+1}= e^{\log(\gamma_0)+\gamma_1 \log(c_{t+1}/c_t)+\gamma_2 \log(R^*_{t+1})+\log(R_{j,t+1})} \]

hence the log of the expectation which is equal to zero, is also equal to the linear mean terms plus the variances \[\log(\gamma_0)+\gamma_1 \Delta c+ \gamma_2 r^*+r_j + \frac{\gamma_1^2}{2}\sigma^2_{\Delta c}+\frac{\gamma_2}{2}\sigma_{*,t}^2+\frac{1}{2}\sigma^2_{j,t}\] plus the cross-terms \[\gamma_1 \sigma_{j,\Delta c,t}+\gamma_2 \sigma_{j,r^*,t}+\gamma_1\gamma_2\sigma_{\Delta c,*,t}.\]

Important

NOTE the shape of the SDF in this case is \[M_{t+1}=\gamma_0\left(\frac{c_{t+1}}{c_t}\right)^{\gamma_1}(R^*_{t+1})^{\gamma_2}= e^{\log(\gamma_0)+\gamma_1 \log(c_{t+1}/c_t)+\gamma_2 \log(R^*_{t+1})}\] This form will be used later on…
Via a first order Taylor expansion, the exponential expression is often linearized to \[\frac{e^{m_{t+1}}}{\mathbb{E}[e^{m_{t+1}}]}\approx 1+m_{t+1}-\mathbb{E}[m_{t+1}],\] i.e., \[\frac{M_{t+1}}{\mathbb{E}[M_{t+1}]} \approx b_0+b_1\log(c_{t+1}/c_t)+b_2 \log(R^*_{t+1}).\]

3.5 Alternative: conditional models

In Resurrecting the (C)CAPM- A Cross‐Sectional Test When Risk Premia Are Time‐Varying, the authors propose a variation of Equation 8 in which \(a\) and \(b\) is time-varying: \(m_{t+1}=a_t+b_tr^{mv}_{t+1}\). Of course, this expression is too general and they restrict the coefficients to linear functions of exogenous (predictive) variables \(z_t\). Hence, \[m_{t+1}=(\gamma_0+\gamma_1z_t)+ (\eta_0+\eta_1z_t)r^{mv}_{t+1},\] which is a multifactor model. In the original paper, the authors use the log consumption/wealth ratio for \(z_t\).

If we write \(m_{t+1}=c'F_{t+1}\), then from Equation 5, the excess return has the form

\[E[r^n_{t+1}-r^f_{t+1}]=a + \sum_{j=1}^Fb_if_{j,t+1}, \]

where the asset pricing factors \(f_{j,t+1}\) are covariances with the asset’s returns. In the original conditional C-CAPM paper, the authors rely on Fama-MacBeth regressions to test the superiority of conditioning with a exogenous variable (see below).

4 Empirical evidence

4.1 Data

4.1.1 Financial series

There are different sources from which we can fetch data for the equity premium:

Let’s have a look. Below, we download the data from the Five factor asset pricing model paper. It provides series for five factors.

#min_date <- "1980-01-01"                                               # Starting date
min_date <- "1999-03-01"                                               # Starting date
temp <- tempfile()
link <- "https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_5_Factors_2x3_CSV.zip"
download.file(link, temp, quiet = TRUE)                                # Download!
nb_factors <- 5                                                        # Number of factors
FF_factors_US <- read_csv(unz(temp, 
                              "F-F_Research_Data_5_Factors_2x3.csv"),  # The file name
                          skip = 3) |>            # Check the nb of lines to be skipped (could be 2!)
    rename(Date = `...1`, MKT_RF = `Mkt-RF`) |>                        # Change name of 1st columns
    mutate_at(vars(-Date), as.numeric) |>                              # Convert to number
    mutate(Date = ymd(parse_date_time(Date, "%Y%m"))) |>               # Date in right format
    mutate(Date = rollback(Date + months(1)))                          # End of month date
FF_factors_US <- FF_factors_US |> mutate(MKT_RF = MKT_RF / 100,        # Scaling returns
                                         SMB = SMB / 100,
                                         HML = HML / 100,
                                         RMW = RMW / 100,
                                         CMA = CMA / 100,
                                         RF = RF / 100) |>             # That's the risk-free rate
    filter(Date >= min_date)                                           # Keep the recent points
head(FF_factors_US)   
Date MKT_RF SMB HML RMW CMA RF
1999-03-31 0.0345 -0.0423 -0.0274 -0.0407 -0.0142 0.0043
1999-04-30 0.0433 0.0452 0.0246 -0.0253 0.0089 0.0037
1999-05-31 -0.0246 0.0371 0.0235 0.0093 0.0334 0.0034
1999-06-30 0.0477 0.0229 -0.0319 0.0113 -0.0321 0.0040
1999-07-31 -0.0349 0.0257 -0.0044 0.0036 0.0322 0.0038
1999-08-31 -0.0138 -0.0173 -0.0187 -0.0024 0.0064 0.0039

Here, we are only interested in the MKT_RF factor, which gives market returns minus the risk free rate, i.e., exactly the ingredient of the equity risk premium.
Now, let’s plot the cumulative returns.

library(plotly)
g <- FF_factors_US |>
  mutate(cumret = cumsum(MKT_RF)) |>
  ggplot(aes(x = Date, y = cumret)) + geom_line() +
  theme_classic() + 
  theme(axis.title = element_blank(),
        title = element_text(size = 8, face = "bold")) +
  ggtitle("Cumulative market returns net of risk-free rate")
ggplotly(g)

The fact that the curve increases so much is referred to as the equity premium puzzle because many standard models fail to provide growth rates that are compatible with the data.

4.1.2 Consumption

Next, we move to consumption data, which comes in many forms. The most important dichotomy is the durable versus nondurable goods.

We want to use the data from the FRED (Federal Reserve of Saint Louis). The R package {fredr} requires authentication. Hence we use direct queries instead. The series can be accessed via simple URLs of the type: https://fred.stlouisfed.org/series/PCE, which corresponds to Personal Consumption Expenditures. We also add the non-durable component to the data (PCEND).
Let’s have a look.

temp <- tempfile()
link <- "https://fred.stlouisfed.org/graph/fredgraph.xls?id=PCE"
download.file(link, temp, quiet = TRUE)
cons_data <- read_excel(temp, skip = 10)
link <- "https://fred.stlouisfed.org/graph/fredgraph.xls?id=PCEND"
download.file(link, temp, quiet = TRUE)
cons_data <- cons_data |> 
  left_join(read_excel(temp, skip = 10), by = "observation_date") |>
  mutate(observation_date = observation_date - 1,   # Last day of the month
         observation_date = as.Date(observation_date)) |>  
  rename(date = observation_date) |>
  filter(date > min_date) 
cons_data |> head()
date PCE PCEND
1999-03-31 6199.5 1414.3
1999-04-30 6232.1 1420.8
1999-05-31 6260.3 1419.7
1999-06-30 6287.6 1421.8
1999-07-31 6331.9 1439.3
1999-08-31 6386.5 1459.1

And plot the full PCE.

cons_data |> 
  pivot_longer(-date, names_to = "type", values_to = "cons") |>
  ggplot() + geom_line(aes(x = date, y = cons, color = type)) + 
  theme_classic() + scale_y_log10() + 
  theme(axis.title = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.15,0.9),
        title = element_text(size = 8, face = "bold")) +
  ggtitle("Personal Consumption Expenditure in the US") +
  scale_color_manual(values = c( "#1166BB", "#DD6611"))

4.2 First analysis

Next, let us recall the formula that links average returns to average consumption growth in the case of CRRA preferences and Gaussian variables: \[\mathbb{E}_t[R_{t+1}]=\gamma \mathbb{E}_t[G_{t+1}]-\log(\beta)-\sigma_t^2/2,\] where \(\gamma\) is risk aversion, \(\beta\) is the discounting rate and \(\sigma_t^2\) is the variance of \(U_{t+1}=-\gamma G_{t+1}+ R_{t+1}\).

In this exercise, we wish to look at the effect of \(\gamma\). We fix \(\beta=0.998\), which corresponds to a realistic risk-free rate of approximately \(r=0.02\) and hence plausible for discounting purposes. It is also a value close to the ones estimated by Hansen & Singleton 1983. Below, we look at unconditional quantities, i.e., when taking the expectation of the above expression, which is much simpler.

beta <- 1-0.02/12
g_pce <- cons_data$PCE / lag(cons_data$PCE)        # Full consumption
G_pce <- log(g_pce)[-1]
g_pcend <- cons_data$PCEND / lag(cons_data$PCEND)  # Non durable consumption 
G_pcend <- log(g_pcend)[-1]
r <- FF_factors_US$MKT_RF + FF_factors_US$RF + 1
R <- log(r)[-1]

test_function <- function(gamma, G, R, beta){
  gamma * mean(G) - log(beta) - var(-gamma * G + R)/2  
}

data.frame(gamma = seq(0.15, 5, by = 0.1)) |>
  ggplot(aes(x = gamma)) + 
  geom_function(fun = test_function, aes(color= "Total Consumption"),
                args = list(G = G_pce, R = R, beta = beta)) + 
  geom_function(fun = test_function,  aes(color= "Non. Dur. Consumption"),
                args = list(G = G_pcend, R = R, beta = beta)) + 
  scale_color_manual(values = c("#CC6611",  "#DD1144")) + 
  geom_hline(yintercept = mean(R, na.rm = T), linetype = 2) +
  geom_label(aes(x = 4, y = mean(R, na.rm = T)), label = "Average stock return", size = 3) + 
  theme_classic() +  ylab("") + xlab(latex2exp::TeX("$\\gamma$")) + 
  theme(legend.position = c(0.3,0.9),
        legend.title = element_blank()) + 
  ggtitle(latex2exp::TeX("Plot of $\\gamma \\rightarrow \\gamma E_t \\[G_{t+1}\\]-log(\\beta)-\\sigma_t^2/2$"))

We see that for the model to work, we would need \(\gamma \approx 1.5\). For \(\gamma\), the estimates in Hansen & Singleton 1983 are all over the place (the coefficient is called \(\alpha=1-\gamma\) in our notations). But overall \(\gamma \approx 1.5\) is consistent with the average values they report.

For the record (to be used later on), we compute \(\sigma\) the standard deviation of consumption growth.

sd(G_pce, na.rm = T)
[1] 0.01127287
sd(G_pcend, na.rm = T)
[1] 0.01415483

As a comparison point, we produce below a plot from the paper Relative Risk Aversion- A Meta-Analysis, which compiles many values for the RRA (\(\gamma\)). The blue bars pertain to estimated values while the light grey ones to calibrated ones. 2 We see that a value of \(\gamma=2\) is reasonable. Hence, the simple calibration to the market returns is realistic.

Distribution of relative risk aversion across 1,000+ estimates

Let us illustrate the impact of risk aversion for CRRA utilities.

crra <- function(x,a){
  x^(1-a)/(1-a)
}
data_frame(x=c(1,5)) |>
  ggplot(aes(x = x)) + theme_classic() + ylab("utility") +
  geom_function(fun = crra, args = list(a = 2), aes(color = "a = 2")) +
  geom_function(fun = crra, args = list(a = 3), aes(color = "a = 3")) +
  geom_function(fun = crra, args = list(a = 4), aes(color = "a = 4")) +
  theme(legend.position = c(0.7,0.3),
        legend.title = element_blank())

Simply put, a high aversion glues the utility to zero for large values of consumption.

NOTE: in Hansen & Singleton 1983, the authors assume that the vector \(Y_t=[X_t,R_t^{(1)},\dots, R_t^{(N)}]\) follows a special type of VAR(1) - first order auto-regressive vector. And the parameters of this process must also be estimated alongside \(\beta\) and \(\gamma\). This requires time-series that are long enough.

4.3 The cross-section of returns

But this is not the issue with the C-CAPM. The issue is with the cross-section of assets. Let us focus on stocks below. We download a few time-series of prices for large US corporations. The tickers are those of:

AAPL (Apple, tech) BA (Boeing, industry) C (Citigroup, bank)
CVX (Chevron, energy) DIS (Disney, entertainment) F (Ford, industry)
GE (General Electric, misc) MCD (McDonalds, catering) MMC (Marsh & McLennan, consulting)
MSFT (Microsoft, tech) NVDA (NVIDIA, tech) PFE (Pfizer, heathcare)
WMT (Walmart, retail) XOM (Exxon, energy) SPY (S&P500 - index)

We even fetch the data for the SPY, an exchange-traded fund that tracks (replicates the S&P500 - one of the most important financial indices in the US and in the world).

NOTE: to get more representative and robust results, we should be working with more (hundreds) of stocks.

NOTE: because of the auto.assign feature, the code will only be shown in the right margin (minor technical glitch!).

tickers <- c("AAPL", "BA", "C", "CVX", "DIS", "F", "GE", "MCD", "MMC",  
            "MSFT", "NVDA", "PFE", "WMT", "XOM", "SPY")  
min_date <- "1999-03-01"                      # Starting date
max_date <- "2023-12-18"                      # Ending date => take a recent date!
prices <- getSymbols(tickers, src = 'yahoo',  # Data from Yahoo Finance
                     from = min_date,         # Start date
                     to = max_date,           # End date
                     auto.assign = TRUE, 
                     warnings = FALSE) %>% 
  map(~Ad(get(.))) %>%                        # Retrieving the data
  reduce(merge) %>%                           # Merge in one dataframe
  `colnames<-`(tickers)                       # Set the column names
prices |> head()                              # Have a look at the result!
                AAPL       BA        C      CVX      DIS        F       GE
1999-03-01 0.2554390 22.69916 169.1944 15.45154 26.56109 14.34456 109.3047
1999-03-02 0.2620618 22.09972 162.9791 15.37535 26.08424 14.03740 107.5449
1999-03-03 0.2587509 21.70009 159.8714 15.84511 26.32267 13.96061 106.9357
1999-03-04 0.2530740 22.29953 166.6047 16.11175 26.84722 14.34456 109.2179
1999-03-05 0.2511820 22.73912 170.5756 16.51802 27.32408 14.77460 112.6819
1999-03-08 0.2601698 22.25957 171.2661 16.46725 27.80094 14.75924 113.9045
                MCD      MMC     MSFT      NVDA      PFE      WMT      XOM
1999-03-01 23.97711 20.23543 23.51988 0.4216439 18.33563 27.87891 15.15487
1999-03-02 24.89466 20.74705 23.02585 0.4180609 18.31841 27.73688 15.06769
1999-03-03 24.61767 20.95876 23.19052 0.3893938 18.12041 28.36587 15.27111
1999-03-04 24.96391 21.50566 23.59737 0.3810331 18.30120 29.01516 15.76514
1999-03-05 26.12381 21.89378 24.01391 0.4025330 18.80908 30.27318 16.20104
1999-03-08 25.06778 22.01728 24.64356 0.4085057 19.22228 30.33404 16.49164
                SPY
1999-03-01 79.13185
1999-03-02 78.43337
1999-03-03 78.85249
1999-03-04 79.85036
1999-03-05 81.45696
1999-03-08 81.98582
rm(list = tickers)                            # Remove unnecessary variables from the env.

Then, we compute the monthly returns.

returns <- prices %>%                                 # Start from prices
  to.monthly(indexAt = "lastof", OHLC = FALSE) %>%    # Convert to monthly 
  data.frame(Date = index(.)) %>%                     # Convert the index to a date
  remove_rownames() %>%                               # Remove index => converted into row names
  pivot_longer(-Date, names_to = "Asset", 
               values_to = "Price") %>%               # Put the data in 'tidy' format
  group_by(Asset) %>%                                 # Group the rows by asset to compute returns
  mutate(returns = Price / dplyr::lag(Price) - 1,     # Compute the returns
         returns = returns |> round(4)) %>%           # To ease presentation
  select(-Price) %>%                                  # Remove price column
  pivot_wider(names_from = "Asset", 
              values_from = "returns") %>%            # Put the data back in matrix form
  select(all_of(c("Date", tickers))) %>%              # Keep only the relevant columns
  na.omit()                                           # Discard rows with missing/NA data
returns <- returns[1:length(G_pce),]                  # Crop to match size of consump data
head(returns)                                         # Again, show the result!
Date AAPL BA C CVX DIS F GE MCD MMC MSFT NVDA PFE WMT XOM SPY
1999-04-30 0.2800 0.1949 0.1755 0.1239 0.0201 0.1360 -0.0475 -0.0648 0.0368 -0.0927 -0.1361 -0.1707 -0.0020 0.1771 0.0380
1999-05-31 -0.0421 0.0387 -0.1152 -0.0667 -0.0827 -0.1065 -0.0350 -0.0903 -0.0498 -0.0077 -0.0651 -0.0683 -0.0734 -0.0336 -0.0229
1999-06-30 0.0511 0.0461 0.0755 0.0277 0.0579 -0.0120 0.1112 0.0682 0.0404 0.1177 0.1209 0.0187 0.1333 -0.0344 0.0554
1999-07-31 0.2024 0.0313 -0.0591 -0.0401 -0.1055 -0.1332 -0.0324 0.0137 0.0098 -0.0485 0.0523 -0.0677 -0.1244 0.0292 -0.0310
1999-08-31 0.1717 0.0017 -0.0028 0.0182 0.0068 0.0747 0.0304 -0.0063 -0.0419 0.0787 0.3975 0.1170 0.0488 -0.0013 -0.0052
1999-09-30 -0.0297 -0.0593 -0.0098 -0.0386 -0.0631 -0.0360 0.0587 0.0453 -0.0592 -0.0216 -0.3156 -0.0497 0.0745 -0.0364 -0.0223

So now to the heart of the problem. And there are several ways to proceed. Either, take all the data and estimate \(\gamma\) and \(\beta\) in Equation 6 thanks to several stock points. In this case, the VAR model mentioned above is larger. And then see if the restricted model (because it must satisfy more constraints due to more assets) yields results similar to the original one, via a likelihood ratio test. In Hansen & Singleton 1983, the tests argue against the C-CAPM.

Let’s take a simpler route here and look at the sequence of unconditional quantities from Equation 12 and fit a simple linear model on

\[\mu^{(n)}+(\sigma^{(n)})^2/2= a + b_1\text{cov}(r^{(n)},\Delta c) + b_2\text{cov}(r^{(n)},r^{(*)}) + e^{(n)},\]

We add a constant for the sake of curiosity. In the theoretical formulation, there is none.

An important paper for cross-section-based tests is Risk, Return, and Equilibrium: Empirical Tests, often referred to as “Fama-MacBeth”, the names of the authors. Imagine we seek to test the relationship: \(\mathbb{E}[r^{(n)}-r^f]=\beta^{(n)}\mathbb{E}[r^{(M)}-r^f]\), where we sometimes confuse \(r^{(M)}\) with \(r^*\), i.e., the market versus the optimal return. In some models, they are supposed to be the same. In fact, this term can be replaced by any factor that either seems reasonable or stems from a theoretical equilibrium model: \(\bar{r}^n=a+\beta \bar{f}+e\) - and in fact the factor can be of higher dimension.

The problem is that the equation has only unknowns: expected returns and loadings \(\beta^{(n)}\) - whereas we only observe realized returns. Fama & Macbeth first start by estimating the loadings \(\hat{\beta}^{(n)}\) via time-series regressions involving realized excess returns: \(r_t^{(n)}=a^{(n)}+\beta^{(n)} f_t+e^{(n)}_t\) for all \(n\) (asset-by-asset). Then, for each time period \(t\), they regress \[r_t^{(n)}=\alpha_t +\gamma_t \hat{\beta}^{(n)}+\epsilon_{t}.\] This generates a time-series of \(\hat{\gamma}_t\) which are the local estimated premia for the factors. It is then possible to test if they are non-zero or positive. If they are statistically significantly non-zero, then it is customary to say that the factor is “priced”. In addition, if returns are fully spanned by the betas, then the average pricing error \(\mathbb{E}[\alpha]=T^{-1}\sum_{t=1}^T\alpha_t\) should be zero.

NOTE: technically, using estimates in the second pass generates an “error-in-variable” problem; see On the Estimation of Beta-Pricing Models. Moreover, autocorrelation in residuals can be handled with non iid estimates for the standard errors (see Newey-West (1987) and Andrews (1991)).

We prepare the data for the regression.

mu <- colMeans(returns |> select(-Date)) # Mean of returns
mu <- mu - mu[length(mu)]                # Subtract the market return
sigma <- apply(returns |> select(-Date), # Vol of returns
               2, 
               sd) 
mu <- mu+sigma^2/2                       # Dependent variable
data_reg <- returns |>
  bind_cols(delta_G = G_pce) |>
  pivot_longer(AAPL:XOM, names_to = "ticker", values_to = "return") |>
  group_by(ticker) |>
  summarise(cov_market = cov(return, SPY),
            cov_cons_g = cov(return, delta_G)) |>
  bind_cols(exp_return = mu[-length(sigma)])
data_reg[1:3,]
ticker cov_market cov_cons_g exp_return
AAPL 0.0027503 0.0001814 0.0289274
BA 0.0022808 0.0002827 0.0098688
C 0.0035089 0.0003073 0.0025075
library(ggrepel) # This is to show neat labels
data_reg |>
  ggplot(aes(x = exp_return, y = cov_market)) + 
  geom_smooth(method = "lm", level = 0., size = 0.5) + geom_point() + 
  geom_text_repel(aes(label = ticker), size = 2) +
  theme_classic() + xlab("expected returns") +
  ylab("covariance with the market")

The link seems positive, but driven by a few outlying points mainly (F, AAPL, NVDA)…

Now to the model:

library(sjPlot) # This package is for neat regression outputs
lm(exp_return ~ cov_market + cov_cons_g, 
   data = data_reg) |> tab_model()
  exp return
Predictors Estimates CI p
(Intercept) -0.00 -0.02 – 0.01 0.589
cov market 11.05 4.70 – 17.39 0.003
cov cons g -60.88 -123.07 – 1.31 0.054
Observations 14
R2 / R2 adjusted 0.589 / 0.514

The result is not too bad! The intercept is virtually zero and the two independent variables seem to have some explanatory power over the cross-section of vol-corrected returns. Hence, even unconditionally, the model is not too far-fetched (with a relatively high \(R^2\)).

lm(exp_return ~ cov_market + cov_cons_g - 1, 
   data = data_reg) |> tab_model()
  exp return
Predictors Estimates CI p
cov market 9.97 5.44 – 14.51 <0.001
cov cons g -67.62 -121.63 – -13.61 0.018
Observations 14
R2 / R2 adjusted 0.730 / 0.685

It’s almost even better without the intercept.
This is only preliminary work, and a better characterization of the model’s ability to price returns correctly would actually work on estimates of conditional returns, like in the Fama-Macbeth tests.

4.4 Cumulants

Now let us have a look at the cumulant specification for the risk premium: \(rp=e^{c(\lambda)+c(-\gamma)-c(\lambda-\gamma)}\), with \(c(\theta)=\log(\mathbb{E}[e^{\theta g}])\). Note that there are two degrees of freedom: the risk aversion \(\gamma\) and the dividend-consumption link \(\lambda\) from \(d_t=c_t^\lambda\). The discount rate \(\rho\) is absent in the formula.

Let us have a look at the cumulant function for consumption log-growth.

cumul <- function(theta, x){
  theta <- matrix(theta, ncol = 1)
  x <- matrix(x, ncol = 1)
  log(rowMeans(exp(theta %*% t(x)), na.rm = T))
}

tibble(theta = c(-30,10)) |>
  ggplot(aes(x = theta)) + xlab(latex2exp::TeX("$\\theta$")) +
  theme_classic() + ylab(latex2exp::TeX("$c(\\theta)$")) +
  geom_vline(xintercept = 0, linetype = 2, color = "#999999", linewidth = 0.2) +
  geom_function(fun = cumul, args = list(x = G_pce)) +
  geom_hline(yintercept = 0, linetype = 2, color = "#999999", linewidth = 0.2)

This is the actual, data-driven, curve. In the original paper, Martin shows that depending on the ex-ante inclusion of jumps, the shape can change a lot.

Now, let us plot the function \(e^{c(\lambda)+\rho-c(\lambda-\gamma)}\) for several reasonable values of \(\lambda\) (color) and \(\gamma\) (\(x\)-axis). We compare with a reasonable value for the risk premium of \(0.06/12=0.005\).

premium <- function(gamma, lambda, x){
  exp(cumul(lambda, x) + cumul(-gamma,x) - cumul(lambda-gamma, x)) - 1
}

tibble(gamma = c(0,20)) |>
  ggplot(aes(x = gamma)) + xlab(latex2exp::TeX("$\\gamma$")) +
  theme_classic() + ylab(latex2exp::TeX("$rp(\\gamma)$")) +
  geom_hline(yintercept = 0.005) +
  geom_vline(xintercept = 0, linetype = 2, color = "#999999", linewidth = 0.2) +
  annotate("text", x = 3, y = 0.0055, label = "risk premium", fontface = 2) +
  theme(legend.position = c(0.55,0.85),
        legend.title = element_text(face = "bold")) +
  geom_function(fun = premium, args = list(lambda = 0.5, x = G_pce), aes(color = "lambda = 0.5")) +
  geom_function(fun = premium, args = list(lambda = 1.0, x = G_pce), aes(color = "lambda = 1.0")) +
  geom_function(fun = premium, args = list(lambda = 1.5, x = G_pce), aes(color = "lambda = 1.5")) +
  geom_function(fun = premium, args = list(lambda = 2.0, x = G_pce), aes(color = "lambda = 2.0")) +
  geom_hline(yintercept = 0, linetype = 2, color = "#999999", linewidth = 0.2)

We see that reaching the sought level requires relatively large values of \(\lambda\) and \(\gamma\). \(\lambda >1\) corresponds to assets with levered claims, which is not necessarily suited to simple stocks. Hence, for \(\lambda=1\) (consumption equals dividends), the require risk aversion is \(\gamma=20\), which is somewhat large.

5 Conclusion

Asset pricing models that rely on aggregate consumption form a rich family. Their empirical relevance depends on the way they are specified and on what is tested.

Footnotes

  1. EIS in this context is \(EIS=\left|\frac{\partial \log(c_t/c_{t+1})}{\partial \log \frac{\partial U/\partial c_t}{\partial U/\partial c_{t+1}}} \right|=(1-\rho)^{-1}\) with \(U=((1-\beta)c_t^\rho+\beta c_{t+1}^\rho)^{1/\rho}\).↩︎

  2. The difference between estimation and calibration is not obvious. Estimation requires the definition of an estimator (OLS, ML or GMM) and incorporates the notion of randomness. Calibration is more heuristic. For instance, we calibrate an option pricing model to fit the market data, i.e., to minimize some error function on option prices or implied volatilities. Sometimes, calibration requires fixing parameters to “reasonable” values.↩︎